home *** CD-ROM | disk | FTP | other *** search
/ Mac Magazin/MacEasy 79 / maccd 79.iso / multimedial / GL Tron / Source / gltron / mtllib.c < prev    next >
Encoding:
C/C++ Source or Header  |  2001-05-13  |  1.9 KB  |  85 lines  |  [TEXT/CWIE]

  1. #define MAX_MATERIALS 100
  2.  
  3. #include "model.h"
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7.  
  8. int loadMaterials(char *filename, Material **materials) {
  9.   Material *m;
  10.   FILE *f;
  11.   char buf[120];
  12.   char namebuf[120];
  13.   int iMaterial = -1;
  14.   int iLine = 0;
  15.  
  16.   m = (Material *) malloc(MAX_MATERIALS * sizeof(Material));
  17.  
  18.   if((f = fopen(filename, "r")) == 0) {
  19.     fprintf(stderr, "could not open file '%s'\n", filename);
  20.     return -1;
  21.   }
  22.   while(fgets(buf, sizeof(buf), f)) {
  23.     switch(buf[0]) {
  24.     case 'n':
  25.       if(sscanf(buf, "newmtl %s ", namebuf) == 1) {
  26.     iMaterial++;
  27.     (m + iMaterial)->name = (char*) malloc(strlen(namebuf) + 1);
  28.     sprintf((m + iMaterial)->name, "%s", namebuf);
  29.     
  30.     (m + iMaterial)->ambient[3] = 1.0;
  31.     (m + iMaterial)->diffuse[3] = 1.0;
  32.     (m + iMaterial)->specular[3] = 1.0;
  33.       } else {
  34.     fprintf(stderr, "warning: ignored line %d\n", iLine);
  35.       }
  36.       break;
  37.     case 'K':
  38.       if(iMaterial >= 0) {
  39.     switch(buf[1]) {
  40.     case 'a': sscanf(buf, "Ka %f %f %f",
  41.              (m + iMaterial)->ambient,
  42.              (m + iMaterial)->ambient + 1,
  43.              (m + iMaterial)->ambient + 2);
  44.     break;
  45.     case 'd': sscanf(buf, "Kd %f %f %f",
  46.              (m + iMaterial)->diffuse,
  47.              (m + iMaterial)->diffuse + 1,
  48.              (m + iMaterial)->diffuse + 2);
  49.     break;
  50.     case 's': sscanf(buf, "Ks %f %f %f",
  51.              (m + iMaterial)->specular,
  52.              (m + iMaterial)->specular + 1,
  53.              (m + iMaterial)->specular + 2);
  54.     break;
  55.     default: 
  56.       fprintf(stderr, "unknown light model at line %d\n", iLine);
  57.       break;
  58.     }
  59.       }
  60.       break;
  61.       /* ignore the rest... */
  62.     }
  63.     iLine++;
  64.   }
  65.   /* allocate the needed materials */
  66.   /* copy the data */
  67.   /* free the temporary memory */
  68.   /* return number of materials */
  69.   *(materials) = (Material*) malloc((iMaterial + 1) * sizeof(Material));
  70.   memcpy(*materials, m, (iMaterial + 1) * sizeof(Material));
  71.   free(m);
  72.   fclose(f);
  73.   return iMaterial + 1;
  74. }
  75.                
  76.     
  77.  
  78.     
  79.     
  80.     
  81.       
  82.                
  83.   
  84.  
  85.